package com.qfedu.tantu.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qfedu.tantu.config.RedisKeyConfig;
import com.qfedu.tantu.dao.UserDao;
import com.qfedu.tantu.dao.UserLogDao;
import com.qfedu.tantu.dto.NewUserDto;
import com.qfedu.tantu.dto.UserFindDto;
import com.qfedu.tantu.dto.UserLoginDto;
import com.qfedu.tantu.entity.User;
import com.qfedu.tantu.entity.UserLog;
import com.qfedu.tantu.service.intf.UserService;
import com.qfedu.tantu.type.UserLogType;
import com.qfedu.tantu.util.JedisUtil;
import com.qfedu.tantu.util.PassUtils;
import com.qfedu.tantu.util.StringUtil;
import com.qfedu.tantu.vo.R;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * @Description:
 * @Author: 赵金帅
 * @Date: 2022/06/29/18:47
 */
@Service
public class UserServiceimpl implements UserService {
    public static final String KEY="TcTlIDBOUVqWc8KZnmqdzQ==";
    @Resource
    private UserDao userDao;
    @Resource
    private UserLogDao userLogDao;
    /**
     * 验证手机号*/
    @Override
    public R checkPhone(String phone) {
        //判断手机号格式
        if (StringUtil.isPhone(phone)){
            //数据库查询手机号是否可用
            User user = userDao.selectOne(new QueryWrapper<User>().eq("phone", phone));
            if (user!=null){
                return R.ok();
            }
        }
        return R.fail("手机号输入有误");
    }
    /**
     * 手机号登录*/
    @Override
    public R phoneLogin(UserLoginDto dto) {
        //验证参数
        if (dto!=null){
            if (StringUtil.isNotEmpty(dto.getName(),dto.getPassword())){
                //查询数据库,验证手机号或账号
                QueryWrapper<User> wrapper = new QueryWrapper<>();
                wrapper.eq("name",dto.getName());
                wrapper.or().eq("phone",dto.getName());
                User user = userDao.selectOne(wrapper);
                if (user!=null){
                    //检验验证码
                    if (dto.getPassword().equals(JedisUtil.getString(RedisKeyConfig.SMS_CODE_LOGIN+dto.getName()))){
                        //根据账号这是唯一登录（判断账号是否在线，在线就存在redis中，注销就删除key）
                        if (JedisUtil.checkKey(RedisKeyConfig.LOGIN_UID+user.getId())){
                            R.fail("账号已存在，请勿重新登陆");
                        }else {
                            //不在线，可以登录
                            JedisUtil.addString(RedisKeyConfig.LOGIN_UID+user.getId(), JSON.toJSONString(user), RedisKeyConfig.LOGIN_UID_TIME);
                            //添加日志表
                            userLogDao.insert(new UserLog(user.getId(), UserLogType.登录.getValue(),"手机号登录",dto.getCity(),dto.getMobie()));
                            return  R.ok(user.getId());
                        }
                    }
                }
            }
        }
        return R.fail("参数或登录状态非法");
    }

    /**
     * 密码登录*/

    @Override
    public R passLogin(UserLoginDto dto) {
            //验证参数
            if (dto!=null){
                if (StringUtil.isNotEmpty(dto.getName(),dto.getPassword())){
                    //查询数据库,验证手机号或账号
                    QueryWrapper<User> wrapper = new QueryWrapper<>();
                    wrapper.eq("name",dto.getName());
                    wrapper.or().eq("phone",dto.getName());
                    User user = userDao.selectOne(wrapper);
                    if (user!=null){
                        //验证密码
//                        if (dto.getPassword().equals(user.getPassword())){
                        /*if (PassUtils.aesdec(KEY,dto.getPassword()).equals(user.getPassword())){*/
                        if (PassUtils.aesdec(KEY,user.getPassword()).equals(dto.getPassword())){
                            //根据账号这是唯一登录（判断账号是否在线，在线就存在redis中，注销就删除key）
                            if(JedisUtil.checkKey(RedisKeyConfig.LOGIN_UID+user.getId())){
                                R.fail("账号已存在，请勿重新登陆");
                            }else {
                                //不在线，可以登录
                                JedisUtil.addString(RedisKeyConfig.LOGIN_UID+user.getId(), JSON.toJSONString(user), RedisKeyConfig.LOGIN_UID_TIME);
                                //添加日志表
                                userLogDao.insert(new UserLog(user.getId(), UserLogType.登录.getValue(),"手机号登录",dto.getCity(),dto.getMobie()));
                                return  R.ok(user.getId());

                            }
                        }
                    }
                }
            }
            return R.fail("账号或密码错误");
    }
    /**
     * 通过手机号修改密码*/
    @Transactional //开启事务
    @Override
    public R passUpdate(UserFindDto dto) {
        if (dto!=null){
            if (StringUtil.isNotEmpty(dto.getPhone(), dto.getCode())){
                User user = userDao.selectOne(new QueryWrapper<User>().eq("phone", dto.getPhone()));
                if (user!=null){
                    //用户存在，检验验证码
                    if (dto.getCode().equals(JedisUtil.getString(RedisKeyConfig.SMS_CODE_FIND+user.getPhone()))){
                        if (userDao.updatePass(dto.getPhone(),dto.getPassword())>0) {
                            //改日志
                            userLogDao.insert(new UserLog(user.getId(), UserLogType.修改密码.getValue(), "修改密码", dto.getCity(), dto.getMobie()));

                            //如果当前账号有在线，需要下线
                            if (JedisUtil.checkKey(RedisKeyConfig.LOGIN_UID + user.getId())) {
                                JedisUtil.delKeys(RedisKeyConfig.LOGIN_UID + user.getId());

                            }
                            return R.ok();
                        }
                    }
                }
            }
        }
        return R.fail("手机号或验证码错误，修改失败");
    }
    /**
     * 注销*/
    @Override
    public R loginOut(int token) {
        if (token>0){
            //检验令牌是否存在
            if (JedisUtil.checkKey(RedisKeyConfig.LOGIN_UID+token)){
                JedisUtil.delKeys(RedisKeyConfig.LOGIN_UID+token);
                return R.ok();
            }
        }
        return R.fail();
    }
/*注册校验手机号*/
    @Override
    public R checkRegister(String phone) {
        if (StringUtil.isPhone(phone)){
            //数据库查询手机号是否可用
            User user = userDao.selectOne(new QueryWrapper<User>().eq("phone", phone));
            if (user==null){
                return R.ok();
            }
        }
        return R.fail("手机号输入有误");
    }

    /*
* 新用户注册*/
    @Transactional//开启事务，一个方法有多个DML类型SQL语句
    @Override
    public R register(NewUserDto dto) {
        //1.校验参数
        if (dto != null) {
            if (StringUtil.isNotEmpty(dto.getCode(), dto.getPhone())) {
                //2.校验手机号的短信验证码校验有没有通过
                User user = userDao.selectOne(new QueryWrapper<User>().eq("phone", dto.getPhone()));
                if (user==null){
                    if (JedisUtil.checkKey(RedisKeyConfig.SMS_CODE_ADD+dto.getPhone())) {
                        //3.密码转为密文
                        User user1 = new User();
                        user1.setFlag(1);
                        user1.setName(dto.getName());
                        user1.setPhone(dto.getPhone());
                        user1.setPassword(PassUtils.aesenc(KEY, dto.getPassword()));
                        //4.新增数据到数据库
                        if (userDao.insert(user1) > 0) ;
                        //5.成功 记录日志
                        userLogDao.insert(new UserLog(user1.getId(), UserLogType.注册.getValue(), "进行了新用户注册，注册成功！", dto.getCity(), dto.getMobie()));
                        return R.ok();
                    }
                }

            }
        }

        return R.fail();
    }

    //查找图像信息gsz
    @Override
    public R queryImg(String name) {
        if(name!=null){
            String img = userDao.query(name);

            System.out.println(img);

            return R.ok(img);
        }
        return R.fail("查找图像信息失败");
    }

}
